"""
数据库连接和配置模块
基于Tortoise ORM实现数据库操作
"""
from tortoise import Tortoise
from typing import List, Dict, Any, Optional
import os
from functools import lru_cache
from pkg.logger import get_logger
from pkg.settings.config import settings

logger = get_logger()

# 使用LRU缓存优化数据库URL处理，避免重复执行
@lru_cache(maxsize=1)
def get_db_url() -> str:
    """
    获取数据库URL，确保格式正确
    结果会被缓存以避免重复处理
    """
    url = settings.DATABASE_URL
    
    # 修复SQLite URL格式 (确保使用三个斜杠)
    # if url.startswith('sqlite:') and not url.startswith('sqlite:///') and not '://:memory:' in url:
    #     if url.startswith('sqlite://.') and not url.startswith('sqlite:///./'):
    #         url = url.replace('sqlite://.', 'sqlite:///.')
    #     elif url.startswith('sqlite://') and not url.startswith('sqlite:///'):
    #         url = url.replace('sqlite://', 'sqlite:///')
    
    print(f"处理后的数据库URL: {url}")
    return url


@lru_cache(maxsize=1)
def get_tortoise_config():
    """动态获取Tortoise ORM配置
    通过AppRegistry发现所有应用模型，生成配置
    结果会被缓存以避免重复执行模型发现
    :return: Tortoise ORM配置字典
    """
    from apps.apps import app_registry
    
    # 发现所有应用模型
    model_paths = app_registry.discover_models()
    # logger.info(f"=== 已发现的模型路径 ===")
    # for path in model_paths:
    #     logger.info(f" - {path}")
    
    return {
        "connections": {"default": get_db_url()},
        "apps": {
            "models": {
                "models": model_paths,
                "default_connection": "default",
            }
        },
        "use_tz": False,
        "timezone": "Asia/Shanghai"
    }

# 获取动态生成的Tortoise ORM配置
TORTOISE_ORM = get_tortoise_config()


async def init_db() -> None:
    """
    初始化数据库连接
    使用缓存的配置信息以提高效率
    """
    # 方式一：导入全局日志实例
    from pkg.logger import get_logger
    logger = get_logger()
    # logger.info("="*50)
    logger.info("数据库初始化")
    # logger.info(f"原始数据库URL: {settings.DATABASE_URL}")
    
    try:
        # print("正在连接数据库...")
        
        # 使用缓存的配置
        config = get_tortoise_config()
        db_url = get_db_url()
        model_paths = config["apps"]["models"]["models"]
        
        # 使用配置初始化
        await Tortoise.init(
            db_url=db_url,
            modules={
                "models": model_paths
            }
        )
        logger.info("数据库连接成功!")
        # logger.info("连接的数据库:")
        # conn = Tortoise.get_connection("default")
        # logger.info(f"  - default: {conn}")
    except Exception as e:
        logger.error("*"*50)
        logger.error(f"数据库连接失败: {str(e)}")
        logger.error("*"*50)
        raise


async def close_db() -> None:
    """
    关闭数据库连接
    """
    from pkg.logger import get_logger
    logger = get_logger()
    
    try:
        # 检查是否有活动连接
        try:
            # 尝试获取默认连接来检查是否已初始化
            Tortoise.get_connection("default")
            logger.info("正在关闭数据库连接")
            await Tortoise.close_connections()
            logger.info("数据库连接已关闭")
        except Exception:
            # 如果获取连接失败，说明没有活动连接
            logger.info("没有活动的数据库连接需要关闭")
    except Exception as e:
        logger.warning(f"关闭数据库连接时出现警告: {e}")
        # 不抛出异常，避免影响程序正常退出



async def generate_schemas() -> None:
    """
    生成数据库表结构
    根据配置决定是否执行迁移
    """
    # 根据配置决定是否迁移 （不需要，沉余判断）
    # if settings.MIGRATE:
    from pkg.logger import get_logger
    logger = get_logger()
    logger.info("正在创建或更新数据库表结构")
    await Tortoise.generate_schemas()
    logger.info("数据库表结构更新完成")

